home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Interactive 7
/
PC World Interactive 7.iso
/
program
/
ctutor.exe
/
SOURCE
/
DOSEX.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-15
|
10KB
|
273 lines
/*******************************************************************/
/* This is an example program to illustrate how to; */
/* 1. Get the time and date from DOS */
/* 2. Set the cursor to any position on the screen */
/* 3. Read characters from the keyboard and display their codes */
/* 4. How to scroll a window up on the monitor */
/* 5. Format a program for ease of reading and understanding */
/* 6. How to do proper prototyping */
/*******************************************************************/
void draw_box(void);
void disp_char(int inchar);
void get_time(int *hour, int *minute, int *second);
void disp_time_date(void);
void pos_cursor(char row, char column);
void scroll_window(void);
#include <stdio.h>
#include <dos.h>
#include <conio.h>
int main()
{
int hour, minute, sec, old_sec;
int character;
draw_box(); /* draw the boxes around the fields */
old_sec = 0; /* this variable stores the old time */
/* so we can look for a change */
do {
if (kbhit()) { /* has a key been hit? */
character = getch(); /* read it in */
disp_char(character); /* display it */
}
get_time(&hour, &minute, &sec); /* get the time of day */
if (sec != old_sec) { /* if it has changed, */
disp_time_date(); /* update the display */
old_sec = sec; /* save new time */
}
} while (character != 'Q'); /* Quit when a Q is found */
pos_cursor(0, 0); /* put cursor at top of screen */
}
/********************************************************* drawbox */
/* This routine draws a box on the screen. The keys hit, and the */
/* time and date are displayed in these boxes. There is nothing */
/* special about these boxes, they are simply output using the */
/* printf function. */
/*******************************************************************/
void draw_box(void)
{
int index;
char line[81];
for (index = 0 ; index < 80 ; index++) /* three blank rows */
line[index] = ' ';
line[80] = NULL; /* end of string */
for (index = 0 ; index < 3 ; index++)
printf("%s", line);
line[8] = 201; /* draw top line of box */
for (index = 9 ; index < 70 ; index++)
line[index] = 205;
line[70] = 187;
printf("%s", line);
line[8] = 186; /* draw sides of large box */
for (index = 9 ; index < 70 ; index++)
line[index] = ' ';
line[70] = 186;
for (index = 0 ; index < 15 ; index++)
printf("%s", line);
line[8] = 204; /* draw line between boxes */
for (index = 9 ; index < 70 ; index++)
line[index] = 205;
line[70] = 185;
printf("%s", line);
line[8] = 186; /* sides for time/date box */
for (index = 9 ; index < 70 ; index++)
line[index] = ' ';
line[70] = 186;
printf("%s", line);
line[8] = 200; /* bottom line of the box */
for (index = 9 ; index < 70 ; index++)
line[index] = 205;
line[70] = 188;
printf("%s", line);
for (index = 0 ; index < 80 ; index++) /* three blank rows */
line[index] = ' ';
for (index = 0 ; index < 3 ; index++)
printf("%s", line);
}
/******************************************************* disp_char */
/* This routine displays the characters hit on the monitor. If */
/* the first character is a zero, a special character has been */
/* hit, and the zero is displayed. The next character is read, */
/* and it is displayed on the monitor. */
/*******************************************************************/
void disp_char(int inchar)
{
scroll_window();
pos_cursor(17, 15); /* position of message on screen */
if(inchar == 0) {
printf(" 00 "); /* a special character was hit */
inchar = getch(); /* get the next part of it */
switch (inchar) {
case 59 :
case 60 :
case 61 :
case 62 :
case 63 : /* these are the function keys */
case 64 :
case 65 :
case 66 :
case 67 :
case 68 : printf("%4d Function key F%d\n",
inchar, inchar - 58);
break;
case 94 :
case 95 :
case 96 :
case 97 :
case 98 : /* these are the ctrl-function keys */
case 99 :
case 100 :
case 101 :
case 102 :
case 103 : printf("%4d Function key Ctrl-F%d\n",
inchar, inchar - 93);
break;
case 84 :
case 85 :
case 86 :
case 87 : /* these are the upper-function keys */
case 88 :
case 89 :
case 90 :
case 91 :
case 92 :
case 93 : printf("%4d Function key Upper-F%d\n",
inchar, inchar - 83);
break;
case 104 :
case 105 :
case 106 :
case 107 :
case 108 : /* these are the alt-function keys */
case 109 :
case 110 :
case 111 :
case 112 :
case 113 : printf("%4d Function key Alt-F%d\n",
inchar, inchar - 103);
break;
default : printf("%4d Special key hit\n", inchar);
}
} else /* a regular character was hit */
printf(" %4d (%c) Character Hit.\n", inchar, inchar);
pos_cursor(25, 1); /* hide the cursor on the 26th line */
}
/******************************************************** get_time */
/* This routine calls the DOS function call for time of day. It */
/* returns the time of day to the calling program in the three */
/* pointers used in the call. */
/*******************************************************************/
void get_time(int *hour, int *minute, int *second)
{
union REGS inregs;
union REGS outregs;
inregs.h.ah = 44; /* Hex 2C - Get current time */
int86(0x21, &inregs, &outregs);
*hour = outregs.h.ch;
*minute = outregs.h.cl;
*second = outregs.h.dh;
}
/************************************************** disp_time_date */
/* This routine displays the time and date on the monitor in a */
/* fixed position. It gets the time from the get_time function, */
/* and gets the date from its own built in DOS call. Good pro- */
/* gramming practice would move the date to another function but */
/* this is an illustrative example to display methods of doing */
/* things. This routine also calls the cursor positioning */
/* function to put the time and date where we want them. */
/*******************************************************************/
void disp_time_date(void)
{
int hour, minute, second;
union REGS inregs;
union REGS outregs;
pos_cursor(19, 19); /* position the cursor for date and time */
inregs.h.ah = 42; /* hex 2A - What is the date? */
int86(0x21, &inregs, &outregs); /* interrupt 21 */
printf("Date = %2d/%2d/%2d ",
outregs.h.dh, /* month - 1 to 12 */
outregs.h.dl, /* day - 1 to 31 */
outregs.x.cx); /* year - 1980 to 2099 */
get_time(&hour, &minute, &second);
printf("Time = %2d:%2d:%2d\n", hour, minute, second);
pos_cursor(25, 1); /* hide the cursor on the 26th line */
}
/****************************************************** pos_cursor */
/* This routine positions the cursor at the requested row and */
/* column. The upper left corner is row 0 and column 0 */
/*******************************************************************/
void pos_cursor(char row, char column)
{
union REGS inregs;
union REGS outregs;
inregs.h.ah = 2; /* service 2 - position the cursor */
inregs.h.dh = row;
inregs.h.dl = column;
inregs.h.bh = 0;
int86(0x10, &inregs, &outregs); /* interrupt 10 */
}
/*************************************************** scroll_window */
/* This routine scrolls all of the material in the key hit window */
/* up one space leaving room for another entry. */
/*******************************************************************/
void scroll_window(void)
{
union REGS inregs;
union REGS outregs;
inregs.h.ah = 6; /* service 6 - scroll window */
inregs.h.al = 1; /* number of lines to scroll */
inregs.h.ch = 3; /* top row of window */
inregs.h.cl = 9; /* left column of window */
inregs.h.dh = 17; /* bottom row of window */
inregs.h.dl = 69; /* right column of window */
inregs.h.bh = 7; /* attribute of blank line */
int86(0x10, &inregs, &outregs); /* interrupt 10 */
}